package tools

import (
	"fmt"
	"github.com/go-ping/ping"
	"os/exec"
)

type PINGCmdParamTemplate struct {
	DstIP string `json:"DstIP"` //目标服务器IP
	Count int    `json:"Count"` //ping次数
}

func PINGCmdInit() {
	pingCmd, err := ping.NewPinger("www.baidu.com")
	if err != nil {
		fmt.Printf("PingCmd输入参数错误 %v\n", err)
		return
	}
	pingCmd.Count = 3
	pingCmd.Source = "192.168.1.24"

	err = pingCmd.Run()
	if err != nil {
		fmt.Printf("PingCmd执行错误 %v\n", err)
	}
	stats := pingCmd.Statistics()
	fmt.Printf("PingCmd执行结果 %v\n", stats)
}

//func SendPing(ip string) (error, string) {
//
//	pingCmd, err := probing.NewPinger(ip)
//	if err != nil {
//		fmt.Printf("执行PingCmd输入参数错误 %v", err)
//		return err, ""
//	}
//	pingCmd.Count = 3
//	err = pingCmd.Run()
//	if err != nil {
//		fmt.Printf("PingCmd执行错误 %v", err)
//		return err, ""
//	}
//	stats := pingCmd.Statistics()
//	fmt.Printf("PingCmd执行结果 %v", stats)
//
//	str := ""
//	str += fmt.Sprintf("\n--- %s ping statistics ---\n", stats.Addr)
//	str += fmt.Sprintf("%d packets transmitted, %d packets received, %v%% packet loss\n",
//		stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
//	str += fmt.Sprintf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n",
//		stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt)
//
//	return nil, str
//}

func SendPing(ip string) (error, string) {

	out, err := exec.Command("ping", ip, "-c", "4").Output()
	if err != nil {
		fmt.Printf("执行ping失败 %v\n", err)
		return err, ""
	}
	fmt.Printf("执行ping成功 %v\n", string(out))

	return nil, string(out)
}

//func SendPing(ip string) (error, string) {
//
//	//cmd := exec.Command("ping", ip, "-c", "4", "-W", "5")
//
//	// 创建一个执行命令的对象
//	cmd := exec.Command("ping", ip, "-c", "4")
//	var out bytes.Buffer
//	cmd.Stdout = &out
//
//	// 启动命令
//	err := cmd.Start()
//	if err != nil {
//		fmt.Printf("启动ping发送失败 %v", err)
//		return err, ""
//	}
//
//	// 创建一个通道来等待命令完成
//	done := make(chan error, 1)
//
//	// 启动一个 Goroutine 来等待命令完成，并将结果发送到通道
//	go func() {
//		done <- cmd.Wait()
//	}()
//
//	select {
//	case <-time.After(5 * time.Second):
//		{
//			// 终止命令
//			err = cmd.Process.Kill()
//			if err != nil {
//				fmt.Printf("终止ping命令失败：%v", err)
//				return err, ""
//			}
//		}
//	case err = <-done:
//		{
//			// 命令执行完成
//			if err != nil {
//				fmt.Printf("ping命令执行错误：%v", err)
//			} else {
//				fmt.Printf("ping命令执行成功 %v", out.String())
//			}
//		}
//	}
//
//	return nil, out.String()
//}

//func SendPing(ip string) (error, string) {
//
//	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
//	defer cancel()
//	cmd := exec.CommandContext(ctx, "ping", ip, "-c", "4")
//
//	var out bytes.Buffer
//	cmd.Stdout = &out
//	err := cmd.Start()
//	if err != nil {
//		fmt.Printf("ping发送失败 %v", err)
//		return err, ""
//	}
//	err = cmd.Wait()
//	if err != nil {
//		fmt.Printf("ping发送失败 %v", err)
//		return err, ""
//	}
//	fmt.Printf("ping发送成功 %v", out.String())
//
//	return nil, out.String()
//}
